package file;

import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * 窗体
 */
public class Window extends JFrame {
    // 相关参数
    private String title = "贪吃蛇练习";
    private int width = 500; // 宽度 16 * 30 + 20
    private int height = 550; // 高度 16 * 30 + 20 + 适当的增加

    // 构造
    public Window() {
        this.setTitle(title);//设置窗体标题
        // 计算标题本身高度问题
        setSize(this, width, height);//设置窗体尺寸

        // 大小固定
        this.setResizable(false);
        // JFrame打开后居中
        setLocationRelativeTo(getOwner());
        // 添加窗体关闭事件
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent ev) {
                setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            }
        });
    }

    // 添加场景
    public void addPanel(JPanel jPanel) {
        //2.添加我们自己编写的画布背景
        this.add(jPanel);
    }

    // 显示打开
    public void open() {
        this.setVisible(true);
    }

    //替代传统的frame.setSize(width,height);
    public void setSize(JFrame frame, int width, int height) {
        //一定要在JFrame显示之前调用
        frame.pack();

        //在默认的setResizable(true); 情况下,titleDefaultHeight = 27,但如果 setResizable(false); titleDefaultHeight = 25
        int titleDefaultHeight = frame.isResizable() ? 27 : 25; //默认开发阶段使用windows 经典主题,标题栏高度= 27

        int containerHeight = frame.getContentPane().getHeight();
        //System.out.println("containerHeight:" + containerHeight); //windows 经典主题或xp主题下 = 1
        //int rootPaneHeight = frame.getRootPane().getHeight(); //取得的高度和container的高度是一样的

        int frameHeight = frame.getHeight();
        //System.out.println("frameHeight:" + frameHeight); //windows经典主题下= 28, windows xp 主题下 = 33

        int titleHeight = frameHeight - containerHeight; //这里就可以得到当前标题栏的实际高度
        if (titleHeight > titleDefaultHeight) {
            int h = titleHeight - titleDefaultHeight; //得到当前使用的主题,标题栏 - 经典主题下的标题栏高度 = 差值
            frame.setSize(width, height + h); //最终确定窗口的高度
        } else {
            frame.setSize(width, height);
        }
    }
}
